/*************************************************************************************
 * Nombre del archivo: Cola_Abstracta.java
 * Universidad del Valle de Guatemala
 * Curso: Sistemas Operativos
 * @author martin
 *          Martín Guzmán 08041
 * Fecha: Febrero de 2010
 * Descripción:
*************************************************************************************/
import java.util.LinkedList;

public abstract class Cola_Abstracta<G> implements Interfaz_Cola<G>{

    protected LinkedList<G> lista = new LinkedList<G>();
    protected G ultimo_entrante;
    protected int id;
    protected String name;
    protected String type;
    protected int quantum;
    protected boolean preemptive;
    protected int queueOnQuantumEnd;
    protected int queueOnIOEnd;
    protected int numero_cola;
    private int excecution_time_in_this=0;

    /***********************************************
     * Método: peek
     * Uso: retorna el primer elemento de la cola
     * @return G elemento genérico
    ***********************************************/
    public G peek(){
        if(!lista.isEmpty()){
            return lista.getFirst();
        }
        return null;
    }

    public void Add_Execution_time(){
        excecution_time_in_this++;
    }

    /***********************************************
     * Método: poll
     * Uso: retorna y saca el primer elemento de la cola
     * @return G elemento genérico
    ***********************************************/
    public G poll(){
        if(!lista.isEmpty()){
            G temp = lista.getFirst();
            lista.removeFirst();
            return temp;
        }
        return null;
    }

    /***********************************************
     * Método: isEmpty
     * Uso: retorna si la cola está vacía
     * @return G elemento genérico
    ***********************************************/
    public boolean isEmpty(){
        if(lista.isEmpty()){
            return true;
        }
        return false;
    }

    /***********************************************
     * Método: remove
     * Uso: remover un elemento de la cola
     * @return void
    ***********************************************/
    public void remove(G objeto){
        this.lista.remove(objeto);
    }

    /***********************************************
     * Método: getCola
     * Uso: retorna una lista con la cola
     * @return LinkedList<G> contiene la cola
    ***********************************************/
    public LinkedList<G> getCola(){
        return this.lista;
    }

    /***********************************************
     * Método: getFirst
     * Uso: obtiene el primer elemento de la cola
     * @return G con el primer objeto de la cola
    ***********************************************/
    public G getFirst(){
        return this.lista.getFirst();
    }

    /**
     * @return the quantum
     */
    public int getQuantum() {
        return quantum;
    }

    /**
     * @param quantum the quantum to set
     */
    public void setQuantum(int quantum) {
        this.quantum = quantum;
    }

    /**
     * @return the preemptive
     */
    public boolean getPreemptive() {
        return this.preemptive;
    }

    /**
     * @param preemptive the preemptive to set
     */
    public void setPreemptive(boolean preemptive) {
        this.preemptive = preemptive;
    }

    /**
     * @return the queueOnQuantumEnd
     */
    public int getQueueOnQuantumEnd() {
        return queueOnQuantumEnd;
    }

    /**
     * @param queueOnQuantumEnd the queueOnQuantumEnd to set
     */
    public void setQueueOnQuantumEnd(int queueOnQuantumEnd) {
        this.queueOnQuantumEnd = queueOnQuantumEnd;
    }

    /**
     * @return the queueOnIOEnd
     */
    public int getQueueOnIOEnd() {
        return queueOnIOEnd;
    }

    /**
     * @param queueOnIOEnd the queueOnIOEnd to set
     */
    public void setQueueOnIOEnd(int queueOnIOEnd) {
        this.queueOnIOEnd = queueOnIOEnd;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the type
     */
    public String getType() {
        return type;
    }

    /**
     * @param type the type to set
     */
    public void setType(String type) {
        this.type = type;
    }

    /**
     * @return the numero_cola
     */
    public int getNumero_cola() {
        return numero_cola;
    }

    /**
     * @param numero_cola the numero_cola to set
     */
    public void setNumero_cola(int numero_cola) {
        this.numero_cola = numero_cola;
    }

    /**
     * @return the excecution_time_in_this
     */
    public int getExcecution_time_in_this() {
        return excecution_time_in_this;
    }


    
    /***********************************************
     * Método: getLast
     * Uso: obtiene el último elemento de la cola
     * @return G con el último objeto de la cola
    ***********************************************/
    /*
    public G getLast(){
        return this.lista.getLast();
    }
     */
}
